//
// Created by hyzh on 2024/4/22.
//

#ifndef TEST_DATE_H
#define TEST_DATE_H
#include <iostream>
#include <assert.h>

class Date
{
public:
    Date(int year = 2000, int month = 1, int day = 1)
    {
        _year = year;
        _month = month ;
        _day = day;
    }

    // 不能是成员函数
//    void operator<<(ostream& out);

    // 友元声明
    friend std::ostream& operator<<(std::ostream& out, const Date& d);
    friend std::istream& operator>>(std::istream& in, Date& d);

    bool operator==(const Date& d) const;
    bool operator!=(const Date& d) const;
    bool operator>(const Date& d) const;
    bool operator>=(const Date& d) const;
    bool operator<=(const Date& d) const;
    bool operator<(const Date& d) const;

    Date& operator+=(int day);
    Date operator+(int day) const;
    Date& operator-=(int day);
    Date operator-(int day) const;

    // ++d;
    Date& operator++();

    // d++
    Date operator++(int);

    // --d;
    Date& operator--();

    // d--
    Date operator--(int);

    // d1 - d2
    int operator-(const Date& d) const;

    // 这俩函数能不能同时存在？可以的，构成函数重载。Date*和const Date*两种类型。但是没有意义。
    // 编译器在编译的时候会去找最匹配的。
    void Print() const;
//    void Print();

    const int& func();
private:
    int _year;
    int _month;
    int _day;
};

// 日期类的比较大小,但是这样不妥。
bool DateLess(const Date& d1, const Date& d2);
bool DateGreater(const Date& d1, const Date& d2);

std::ostream& operator<<(std::ostream& out, const Date& d);
std::istream& operator>>(std::istream& in, Date& d);

void test1();
void test2();
void test3();
void test4();
void test5();
void test6();
void test7();

struct SeqList
{
    void PushBack(int x)
    {
        // ...扩容
        _a[_size++] = x;
    }

    size_t size() const
    {
        return _size;
    }

    // 只读
    const int& operator[](size_t pos) const
    {
        assert(pos < _size);

        // _a是内置类型，编译器会转化为：*(_a+pos)
        return _a[pos]; // 返回的值是在堆上

        // s[i]，s是自定义类型，编译器会看是否重载运算符，如果重载了，就去调用
        // 对应的函数，如果没有就报错。
        // std::cout << s[i] << " ";
    }

    // 可读可写
    int& operator[](size_t pos)
    {
        assert(pos < _size);

        return _a[pos]; // 返回的值是在堆上
    }
private:
    // C++11
    int* _a = (int*)malloc(sizeof(int)*10);
    int _size = 0;
    int _capacity = 0;
};

void PrintF(const SeqList& s);

#endif //TEST_DATE_H
